#include<bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
string st;
int n,m,x,y[105000],yval;
long long resl[105000],resr[105000],res[105000],ans,pw2[2][105000];
inline long long getpw2(long long x) {
    x%=(mod-1);
    return pw2[1][x>>16]*pw2[0][x&65535ll]%mod;
}
long long mtx[105000][33][9],cur[3],nxt[3];//[f(x,len,0),f(x,len,1),2^(len(x+1)-1)]
inline void calc(long long x[],long long y[],long long z[]) {
    z[0]=(x[0]*y[0]+x[1]*y[3]+x[2]*y[6])%mod;
    z[1]=(x[0]*y[1]+x[1]*y[4]+x[2]*y[7])%mod;
    z[2]=(x[0]*y[2]+x[1]*y[5]+x[2]*y[8])%mod;
    z[3]=(x[3]*y[0]+x[4]*y[3]+x[5]*y[6])%mod;
    z[4]=(x[3]*y[1]+x[4]*y[4]+x[5]*y[7])%mod;
    z[5]=(x[3]*y[2]+x[4]*y[5]+x[5]*y[8])%mod;
    z[6]=(x[6]*y[0]+x[7]*y[3]+x[8]*y[6])%mod;
    z[7]=(x[6]*y[1]+x[7]*y[4]+x[8]*y[7])%mod;
    z[8]=(x[6]*y[2]+x[7]*y[5]+x[8]*y[8])%mod;
}
int main() {
    freopen("pearl.in","r",stdin);
    freopen("pearl.out","w",stdout);
    pw2[0][0]=1;
    for (int i=1;i<=100050;i++) pw2[0][i]=pw2[0][i-1]*2%mod;
    pw2[1][0]=1;
    for (int i=1;i<=100050;i++) pw2[1][i]=pw2[1][i-1]*pw2[0][65536]%mod;
    cin>>n>>m>>x>>st;
    for (int i=0;i<m;i++) {
        if (st[i]=='0') y[i]=0;
        else y[i]=1;
    }
    yval=m;
    for (int i=0;i<m;i++) {
        if (y[i]) {
            yval=i;
            break;
        }
    }
    for (int i=0;i<m;i++) {
        mtx[i][0][0]=1;
        mtx[i][0][3]=getpw2(i+1)-1;
        mtx[i][0][1]=1;
        mtx[i][0][4]=mod-1;
        mtx[i][0][7]=1;
        mtx[i][0][8]=getpw2(i+1);
        for (int j=0;j<32;j++) {
            calc(mtx[i][j],mtx[i][j],mtx[i][j+1]);
        }
    }
    for (int i=0;i<m;i++) {
        cur[0]=cur[1]=0;cur[2]=getpw2(i);
        for (int j=0;j<30;j++) {
            if ((x-1)&(1<<j)) {
                nxt[0]=(cur[0]*mtx[i][j][0]+cur[1]*mtx[i][j][3]+cur[2]*mtx[i][j][6])%mod;
                nxt[1]=(cur[0]*mtx[i][j][1]+cur[1]*mtx[i][j][4]+cur[2]*mtx[i][j][7])%mod;
                nxt[2]=(cur[0]*mtx[i][j][2]+cur[1]*mtx[i][j][5]+cur[2]*mtx[i][j][8])%mod;
                cur[0]=nxt[0];cur[1]=nxt[1];cur[2]=nxt[2];
            }
        }
        if (yval<=i) resl[i]=cur[1];
        else resl[i]=cur[0];
        cur[0]=cur[1]=0;cur[2]=getpw2(i);
        for (int j=0;j<30;j++) {
            if ((n-x)&(1<<j)) {
                nxt[0]=(cur[0]*mtx[i][j][0]+cur[1]*mtx[i][j][3]+cur[2]*mtx[i][j][6])%mod;
                nxt[1]=(cur[0]*mtx[i][j][1]+cur[1]*mtx[i][j][4]+cur[2]*mtx[i][j][7])%mod;
                nxt[2]=(cur[0]*mtx[i][j][2]+cur[1]*mtx[i][j][5]+cur[2]*mtx[i][j][8])%mod;
                cur[0]=nxt[0];cur[1]=nxt[1];cur[2]=nxt[2];
            }
        }
        if (yval<=i) resr[i]=cur[1];
        else resr[i]=cur[0];
        res[i]=(resl[i]*(mod+getpw2(1ll*(i+1)*(n-x))-resr[i])+(mod+getpw2(1ll*(i+1)*(x-1))-resl[i])*resr[i])%mod;
        ans=(ans+res[i]*getpw2(1ll*(n-1)*(m-1-i)+i))%mod;
    }
    cout<<ans<<endl;
    return 0;
}
/*
a[1],a[2],...,a[n]=y
res[0],res[1],...,res[m-1]
res[i]*2^((n-1)(m-1-i))=|{a|val[i]=1}|
ans={i,0,m-1}res[i]*2^((n-1)(m-1-i)+i)
res[x]=f(x,n,[y&(2^(x+1)-1)])
f(x,1,0)=f(x,1,1)=0
f(x,len,0)=f(x,len-1,0)+(2^(x+1)-1)f(x,len-1,1)
f(x,len,1)=2^((x+1)(len-1)-1)+f(x,len-1,0)-f(x,len-1,1)

f(x,len,0)=f(x,len-2,0)+(2^(x+1)-1)f(x,len-2,1)+(2^(x+1)-1)(2^((x+1)(len-2)-1)+f(x,len-2,0)-f(x,len-2,1))
=2^(x+1)*f(x,len-2,0)+2^((x+1)(len-1)-1)-2^((x+1)(len-2)-1)
f(x,len,1)=2^((x+1)(len-1)-1)+f(x,len-2,0)+(2^(x+1)-1)f(x,len-2,1)-2^((x+1)(len-2)-1)-f(x,len-2,0)+f(x,len-2,1)
=2^(x+1)*f(x,len-2,1)+2^((x+1)(len-1)-1)-2^((x+1)(len-2)-1)
*/
